#pragma once

#include "task/Task.h"

#include <memory>

namespace threadpool {

    class ThreadPool;

    enum class ThreadStatus {
        ThreadExit = false,   // 线程退出标志
        ThreadContinue = true // 线程继续标志
    };

    class TaskExecutor {

    public:

        /**
          * @brief  任务执行前的自定义行为
          * @note   用于处理自定义任务
          * @param  task 工作任务
          * @param  pool 线程池对象
          * @retval ThreadStatus 当前工作线程是否退出
          */
        virtual ThreadStatus customBeforeExecute(const std::shared_ptr<Task> &task, ThreadPool *pool) {
            return ThreadStatus::ThreadContinue;
        };

        /**
          * @brief  任务执行后的自定义行为
          * @note   用于处理自定义任务
          * @param  task 工作任务
          * @param  pool 线程池对象
          * @retval ThreadStatus 当前工作线程是否退出
          */
        virtual ThreadStatus customAfterExecute(const std::shared_ptr<Task> &task, ThreadPool *pool) {
            return ThreadStatus::ThreadContinue;
        };

        /**
          * @brief  任务执行前的默认行为
          * @note   包含线程池操作、内置任务处理和调用自定义任务处理等
          * @param  task 工作任务
          * @param  pool 线程池对象
          * @retval ThreadStatus 当前工作线程是否退出
          */
        virtual ThreadStatus defaultBeforeExecute(const std::shared_ptr<Task> &task, ThreadPool *pool);

        /**
          * @brief  任务执行后的默认行为
          * @note   包含线程池操作、内置任务处理和调用自定义任务处理等
          * @param  task 工作任务
          * @param  pool 线程池对象
          * @retval ThreadStatus 当前工作线程是否退出
          */
        virtual ThreadStatus defaultAfterExecute(const std::shared_ptr<Task> &task, ThreadPool *pool);

    };

}